package top.codetheory.thread._007_单例;

/**
 * @author:
 * @since: 2024/5/22 下午5:22
 **/
public class _001_单例模式优化 {
}

class Singleton_1 {
    private Singleton_1() {}
    private static Singleton_1 instance;

    // 加了 synchronized，可以保证单例，但是如果有其他线程来获取 instance，每次都会执行加锁的逻辑，有点重了
    public static synchronized Singleton_1 getInstance() {
        if (instance == null) {
            instance = new Singleton_1();
        }
        return instance;
    }
}

class Singleton_2 {
    private Singleton_2() {}
    private static Singleton_2 instance;

    // 双重检查锁，可以保证单例，并且可以优化性能
    // 但是在多线程的情况下，可能会出现指令重排的问题，导致 instance 不为 null，但是里面的属性还没有初始化
    public static Singleton_2 getInstance() {
        if (instance == null) {
            synchronized (Singleton_2.class) {
                if (instance == null) {
                    instance = new Singleton_2();  // 在字节码层面，这行代码是两个操作，一个是new，一个是给instance赋值
                }
            }
        }
        return instance;
    }
}

class Singleton_3 {
    private Singleton_3() {}
    private static volatile Singleton_3 instance;  // 加了 volatile


    public static Singleton_3 getInstance() {
        // 加入读屏障， 保证下面的代码（47 -> 56）按顺序执行
        if (instance == null) {
            synchronized (Singleton_3.class) {
                if (instance == null) {
                    instance = new Singleton_3();  // 加了volatile，禁止重排序
                    // 加入写屏障，保证上面的代码按照顺序执行，即先实例化，再赋值
                }
            }
        }
        return instance;
    }
}